//package com.mp.approvalreq.util;
//
//
//import com.alibaba.fastjson.JSONObject;
//import com.mp.approvalreq.entity.ExcelParam;
//import com.mp.approvalreq.entity.Request;
//import com.mp.approvalreq.entity.Template;
//import com.mp.approvalreq.entity.TemplateComponent;
//import com.mp.approvalreq.service.ReadTemplateServicePrx;
//import com.mp.user.entity.User;
//import com.mp.user.service.UserServicePrx;
//import com.qq.tars.client.util.ServantUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.log4j.Logger;
//import org.apache.poi.hssf.usermodel.HSSFSheet;
//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.ss.usermodel.*;
//
//import java.io.File;
//import java.util.List;
//import java.util.Objects;
//
//public class ExportOthersApproval extends ExportTemplate {
//    private static final Logger logger = Logger.getLogger(ExportOthersApproval.class);
//
//    public ExportOthersApproval(ExcelParam excelParam) {
//        super(excelParam);
//    }
//
//    public void createExcel() throws Throwable {
//        ReadTemplateServicePrx rts = excelParam.getReadService();
//        User user = excelParam.getUser();
//        List<Integer> templateIds = excelParam.getTemplateIds();
//        List<String> days = excelParam.getDays();
//
//        //  获取所有需要导出的 模板的详情
//        List<Template> templateList = rts.getTemplateDetailByTemplateIdList(templateIds);
//
//        //  得到该公司所有员工contactId:User(contactID,name,离职时间)
//        UserServicePrx userServicePrx = ServantUtils.getObject(UserServicePrx.class);
//        convertUserToPeople(userServicePrx.getAllUserBaseInfoList(user.getCompanyId()));
//
//        // 获取被导出人群的信息
//        List<User> userList = userServicePrx.getUserListByContactIds(excelParam.getExportType());
//        excelParam.setUserList(userList);
//
//        //  导出审批类型：请假、外出、申购等等
//        StringBuilder templateNames = new StringBuilder();
//
//        HSSFWorkbook wb = new HSSFWorkbook();
//        initCellStyle(wb);
//
//        for (Template template : templateList) {
//            String sheetName = template.getTemplateName();
//            templateNames.append(sheetName).append("、");
//            HSSFSheet sheet = wb.createSheet(CheckUtil.replaceNonlicetSheetNameCharacter(sheetName));
//            setNoGridLines(sheet);
//            createExcelHeadByDay(sheet, sheetName);
//
//            int lastHeaderRowIndex = sheet.getLastRowNum();           // 每个sheet的头部的最后一行(6)
//            int itemStartIndex = lastHeaderRowIndex + 2;
//
//            // 获取这些人在这些天申请过的审批模板
//            List<Template> hasUsedTemplates = rts.getUsedTemplateInDaysByUser(template, days, userList, 2);
//            if (ListUtils.isNullEmpty(hasUsedTemplates)) {
//                createExcelBodyByDays(sheet, null, itemStartIndex, template);
//            } else {
//                for (Template usedTemp : hasUsedTemplates) {
//                    List<Request> reqList = rts.getOthersApplyByDays(usedTemp, days, userList);
//                    createExcelBodyByDays(sheet, reqList, itemStartIndex, template);
//                    itemStartIndex = sheet.getLastRowNum() + 5;
//                }
//            }
//            // 合并头部
//            mergeHeaderRegion(sheet, lastHeaderRowIndex);
//            // 调整单元格内容宽度
//            autoSizeOfSheetCell(sheet);
//        }
//        if (templateNames.toString().endsWith("、")) {
//            templateNames.deleteCharAt(templateNames.length() - 1);
//        }
//
//        List<File> fileList = getFileList(wb, templateNames);
//        String emailContent = getEmailContentByDays(templateNames.toString());
//        sendEmail(emailContent, fileList);
//    }
//
//    private void createExcelHeadByDay(HSSFSheet sheet, String templateName) throws Throwable {
//        User user = excelParam.getUser();
//        String sheetTime = getExportScopeStrByDays(excelParam.getDays());
//        String exportTime = excelParam.getExportTime();
//        try {
//            int rowIndex = 1;
//            Font titleFont = ExcelUtil.createFont(sheet.getWorkbook(), "微软雅黑", 26, false);
//            CellStyle titleStyle = ExcelUtil.createCellStyle(sheet.getWorkbook(), 1, 1, 1, 1);
//            titleStyle.setAlignment(HorizontalAlignment.LEFT);                                    // 左对齐
//            titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);                            // 垂直居中
//            titleStyle.setFont(titleFont);
//            Row headerRow = sheet.createRow(rowIndex++);
//            ExcelUtil.setHeight(headerRow, 3400);                                                // 固定标题行高3400
//            ExcelUtil.createCommonCell(headerRow, 1, titleStyle, "大管加审批记录导出");                // 创建单元格参数：行,单元格所在列,该行样式,单元格内容      固定内容：大管加审批记录导出
//
//            Font headerFont = ExcelUtil.createFont(sheet.getWorkbook(), "微软雅黑", 16, false);
//            CellStyle headerStyle = ExcelUtil.createCellStyle(sheet.getWorkbook(), 1, 1, 1, 1, HorizontalAlignment.LEFT,
//                    VerticalAlignment.CENTER);
//            headerStyle.setFont(headerFont);
//
//            Row exportCompanyName = sheet.createRow(rowIndex++);
//            ExcelUtil.setHeight(exportCompanyName, 2700);
//            ExcelUtil.createCommonCell(exportCompanyName, 1, headerStyle, "公司名 :" + user.getCompanyName());
//
//            Row exportApprovalType = sheet.createRow(rowIndex++);
//            ExcelUtil.setHeight(exportApprovalType, 2700);
//            ExcelUtil.createCommonCell(exportApprovalType, 1, headerStyle, "审批类型 :" + templateName);
//
//            Row exportScopeRow = sheet.createRow(rowIndex++);
//            ExcelUtil.setHeight(exportScopeRow, 2700);
//            String exportScopeStr = "审批时间 :" + sheetTime;
//            ExcelUtil.createCommonCell(exportScopeRow, 1, headerStyle, exportScopeStr);
//
//            Row exportTimeRow = sheet.createRow(rowIndex++);
//            ExcelUtil.setHeight(exportTimeRow, 2700);
//            ExcelUtil.createCommonCell(exportTimeRow, 1, headerStyle, "导出时间 :" + exportTime);
//
//            Row exportContactRow = sheet.createRow(rowIndex);
//            ExcelUtil.setHeight(exportContactRow, 2700);
//            ExcelUtil.createCommonCell(exportContactRow, 1, headerStyle, "导出人 :" + user.getContactName());
//        } catch (Throwable e) {
//            logger.error(e.getMessage(), e);
//            throw e;
//        }
//    }
//
//    private int applicantIndex;
//    private int relatePeopleIndex;
//    private int approverColIndex;
//    private int ccColIndex;
//    private int ccTempColIndex;
//    private int archiveIndex;
//    private int approvalTimeIndex;
//    private int commentIndex;
//
//    private void createExcelBodyByDays(HSSFSheet sheet, List<Request> reqList, int startIndex, Template template)
//            throws Throwable {
//        // 标题行内容: 申请时间、申请人、模板组件、参与人、审批人、默认抄送人、临时抄送人、归档人、批准时间
//
//        int startLineIndex = 1;                     // 开始列
//
//        // 编号
//        Row itemRow = ExcelUtil.createRow(sheet, startIndex);
//        ExcelUtil.createCommonCell(itemRow, startLineIndex, headStyle, "编号");
//        sheet.setColumnWidth(startLineIndex, 35 * 256);
//
//        // 申请时间
//        ExcelUtil.createCommonCell(itemRow, startLineIndex + 1, headStyle, "申请时间");
//        sheet.setColumnWidth(startLineIndex + 1, 30 * 256);
//
//        // 申请人
//        applicantIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "申请人").getColumnIndex();
//
//        // 模板组件
//        List<TemplateComponent> comList = getComponentList(template);
//        shiftTemplateComponents(comList);                                   // 排除一些不需要的组件
//        createComponentInSheet(comList, startLineIndex, itemRow);    // 打印组件
//        logger.info("该模板的组件numList:" + numList);
//        logger.info("该模板的组件typeList:" + typeList);
//
//        // 相关人群、审批数据
//        relatePeopleIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "参与人").getColumnIndex();
//        approverColIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "审批人").getColumnIndex();
//        ccColIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "默认抄送人").getColumnIndex();
//        ccTempColIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "临时抄送人").getColumnIndex();
//        archiveIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "归档人").getColumnIndex();
//        approvalTimeIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "审批时间").getColumnIndex();
//        commentIndex = ExcelUtil.createCommonCell(itemRow, itemRow.getLastCellNum(), headStyle, "审批评论").getColumnIndex();
//
//        if (!ListUtils.isNullEmpty(reqList)) {
//            // 打印审批组件内容
//            printRequestContent(sheet, reqList, startIndex);
//        }
//    }
//
//    // 打印模板组件
//    private void createComponentInSheet(List<TemplateComponent> comList, int startLineIndex, Row itemRow) {
//        for (TemplateComponent component : comList) {
//            int num = component.getNum();
//            String name = component.getName();
//            // 此组件无需打印
//            if (!numList.contains(num)) {
//                continue;
//            }
//            // 得到该组件在模板中的位置
//            int lineOffset = numList.indexOf(num);
//            // 开始列加一列（隔开申请时间、申请人）再加上它的偏移量
//            int lineIndex = startLineIndex + 2 + lineOffset;
//            // 创建该组件
//            ExcelUtil.createCommonCell(itemRow, lineIndex, headStyle, name);
//        }
//    }
//
//    private void printRequestContent(HSSFSheet sheet, List<Request> reqList, int headRowIndex) throws Throwable {
//        for (int i = 0; i < reqList.size(); i++) {
//            Request req = reqList.get(i);
//            // 标题行下一行,即内容开始行
//            int itemStartIndex = headRowIndex + 1 + i;
//            // 编号第一列
//            int approvalNumIndex = 1;
//            // 申请时间在第2列
//            int applicantTimeLineIndex = 2;
//            // 内容开始列,隔开编号、申请时间、申请人
//            int startLine = 4;
//            Row itemRow = ExcelUtil.createRow(sheet, itemStartIndex);
//
//
//            ExcelUtil.createCommonCell(itemRow, approvalNumIndex, centerDataStyle, req.getApprovalNum());
//            sheet.setColumnWidth(approvalNumIndex, 35 * 256);
//
//            //  申请时间
//            String createTime = changeCHTime(req.getCreateTime());
//            ExcelUtil.createCommonCell(itemRow, applicantTimeLineIndex, centerDataStyle, createTime);
//            sheet.setColumnWidth(applicantTimeLineIndex, 30 * 256);
//
//            // 申请人
//            printContent(req, itemRow, RequestFlag.APPLICANT);
//
//            // 模板组件中对应的审批内容
//            List<TemplateComponent> reqComponents = JSONObject.parseArray(req.getTemplateComponent(), TemplateComponent.class);
//            for (int num : numList) {
//                for (TemplateComponent reqCom : reqComponents) {
//                    if (num != reqCom.getNum()) {
//                        continue;
//                    }
//                    int offset = numList.indexOf(num);
//                    String value = getValue(offset, reqCom, req);       // 获取组件的值
//                    value = removeNewLine(value);
//                    if (isLeftDataStyle(offset)) {
//                        ExcelUtil.createCommonCell(itemRow, startLine + offset, leftDataStyle, value);
//                    } else {
//                        ExcelUtil.createCommonCell(itemRow, startLine + offset, centerDataStyle, value);
//                    }
//                }
//            }
//
//            // 相关人群、审批数据
//            printContent(req, itemRow, RequestFlag.RELA_PEOPLE);
//            printContent(req, itemRow, RequestFlag.APPROVAL_STATUS);
//            printContent(req, itemRow, RequestFlag.JUDGER);
//            printContent(req, itemRow, RequestFlag.CC);
//            printContent(req, itemRow, RequestFlag.CC_TEMP);
//            printContent(req, itemRow, RequestFlag.ARCHIVER);
//            printContent(req, itemRow, RequestFlag.CONFIRM_TIME);
//            printContent(req, itemRow, RequestFlag.COMMENT);
//        }
//    }
//
//
//    private void printContent(Request req, Row row, RequestFlag flag) throws Throwable {
//        int index = getCellIndexByFlag(flag);
//        CellStyle style = getCellStyle(flag);
//        String reqContent = getPrintContent(req, flag);
//        if (StringUtils.isEmpty(reqContent)) {
//            ExcelUtil.createCommonCell(row, index, style, "");
//        } else {
//            if (isPerson(flag)) {
//                if (isApplicant(flag)) {
//                    reqContent = getApplicantName(reqContent);
//                } else {
//                    reqContent = getContactsName(reqContent);
//                }
//            } else if (flag == RequestFlag.CONFIRM_TIME) {
//                reqContent = changeCHTime(reqContent);
//            }
//            ExcelUtil.createCommonCell(row, index, style, reqContent);
//        }
//    }
//
//    private int getCellIndexByFlag(RequestFlag flag) {
//        int index = 0;
//        switch (flag) {
//            case JUDGER:
//                index = approverColIndex;
//                break;
//            case CC:
//                index = ccColIndex;
//                break;
//            case CC_TEMP:
//                index = ccTempColIndex;
//                break;
//            case RELA_PEOPLE:
//                index = relatePeopleIndex;
//                break;
//            case ARCHIVER:
//                index = archiveIndex;
//                break;
//            case CONFIRM_TIME:
//                index = approvalTimeIndex;
//                break;
//            case COMMENT:
//                index = commentIndex;
//                break;
//            case APPLICANT:
//                index = applicantIndex;
//                break;
//            default:
//                break;
//        }
//        return index;
//    }
//
//    private CellStyle getCellStyle(RequestFlag flag) {
//        CellStyle style;
//        if (flag == RequestFlag.COMMENT) {
//            style = leftDataStyle; // 审批评论左对齐
//        } else {
//            style = centerDataStyle;
//        }
//        return style;
//    }
//
//    private String getValue(int offset, TemplateComponent reqCom, Request req) throws Throwable {
//        StringBuilder value = new StringBuilder();
//        String comValue = reqCom.getValue();
//        if (StringUtils.isEmpty(comValue)) {
//            return value.toString();
//        }
//        switch (typeList.get(offset)) {
//            case TIME_TYPE:
//                value.append(changeCHTime(comValue));
//                break;
//
//            case SITE_TYPE:
//                value.append(getSiteTypeValue(comValue));
//                break;
//
//            case MORE_SELECT:
//                value.append(getMoreSelectValue(comValue));
//                break;
//
//            case CLIENT_TYPE:
//                value.append(getClientTypeValue(req.getAncestorId()));
//                break;
//
//            // 如果是考勤方案,则截取最后一个数据字段,eg:美国考勤,2710; 截取为:美国考勤
//            case ATTENDANCE_TYPE:
//                if (comValue.contains(",")) {
//                    value.append(comValue, 0, comValue.lastIndexOf(","));
//                } else {
//                    value.append(comValue);
//                }
//                break;
//
//            default:
//                value.append(comValue);
//                break;
//        }
//        return value.toString();
//    }
//
//}
